\chapter{和构建系统的结合}

Tenon项目原生使用CMake构建系统。它可以直接作为另一个CMake项目的子目录进行构建。

在\verb|add_subdirectory(core)|之前设置\verb|set(TLANG_OUTPUT_DIR "/path/to/output")|
来设置Tenon编译产物的输出目录。

Tenon项目编译出的库文件默认以静态库的形式存在于库原本所在的目录中。编译出的可执行程序输出到
\verb|TLANG_OUTPUT_DIR|指定的目录中。编译出的内置模块输出到\verb|${TLANG_OUTPUT_DIR}/../tenonlib|目录
中，也就是和\verb|TLANG_OUTPUT_DIR|所指定的目录平级的名为tenonlib的目录中。

如果要将Tenon编译成动态库，可以设置cmake的变量\verb|set(TENON_BUILD_SHARED_LIBS ON)|。

当Tenon项目作为独立项目时，编译出的可执行文件包括: tenonc, tenon, tvm.

Tenon作为子项目时，只编译tenonc，用于编译内置库模块。

\section{动态加载so文件}

Tenon语言提供了导入用户自定义的扩展库的功能，可以在编译和运行时，
通过名称在指定的目录下查找到扩展库的tlib文件和对应的动态链接库文件。
tlib文件是Tenon源代码编译后的二进制打包文件，可以跨平台使用；
动态链接库文件则保存了C语言源代码的本地可执行代码。

当运行Tenon程序的时候，Tenon执行器会去指定的目录下加载tlib文件。
有些库文件有对应的.so文件。系统会自动加载和tlib文件在同目录下的同名动态链接库文件，
注册其中的扩展函数。
